﻿// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.LedgerEntryCollection
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 8E14765A-6610-409A-BA36-099A0642905D
// Assembly location: E:\git\ALLIDA\windll\infocard.exe

using Microsoft.InfoCards.Diagnostics;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Microsoft.InfoCards
{
  internal class LedgerEntryCollection : Dictionary<string, LedgerEntry>
  {
    private Uri m_infoCardId;

    private LedgerEntryCollection()
    {
    }

    public void Add(LedgerEntry entry)
    {
      this[entry.Recipient.RecipientId] = entry;
    }

    public LedgerEntryCollection(Uri infoCardId)
    {
      this.m_infoCardId = infoCardId;
    }

    public void Get(StoreConnection con)
    {
      InfoCardTrace.Assert((Uri) null != this.m_infoCardId, "The infocard id must be specified prior to executing this operation");
      ICollection<DataRow> dataRows = con.Query(QueryDetails.FullRow, new QueryParameter("ix_objecttype", new object[1]
      {
        (object) -1
      }), new QueryParameter("ix_parentid", new object[1]
      {
        (object) GlobalId.DeriveFrom(this.m_infoCardId.ToString())
      }));
      if (dataRows == null || dataRows.Count <= 0)
        return;
      foreach (DataRow dataRow in (List<DataRow>) dataRows)
      {
        LedgerEntry ledgerEntry = new LedgerEntry((Stream) new MemoryStream(dataRow.GetDataField()), con);
        this[ledgerEntry.Recipient.RecipientId] = ledgerEntry;
      }
    }

    public void Serialize(Stream stream)
    {
      BinaryWriter writer = new BinaryWriter(stream, Encoding.Unicode);
      writer.Write(this.Count);
      foreach (KeyValuePair<string, LedgerEntry> keyValuePair in (Dictionary<string, LedgerEntry>) this)
        keyValuePair.Value.Serialize(writer);
    }

    public void Save(StoreConnection con)
    {
      InfoCardTrace.Assert((Uri) null != this.m_infoCardId, "The infocard id must be specified prior to executing this operation");
      foreach (KeyValuePair<string, LedgerEntry> keyValuePair in (Dictionary<string, LedgerEntry>) this)
      {
        LedgerEntry ledgerEntry = keyValuePair.Value;
        if (ledgerEntry.IsDirty)
          ledgerEntry.Save(con);
      }
    }
  }
}
